java实现死锁

死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。在多线程中,如果同步中嵌套同步,即多个线程互相拥有对方需要的资源而不释放,就会造成所有的线程都无法执行。

产生是原因有四个:1)竞争资源引起进程死锁 2)可剥夺资源和不可剥夺资源 3)竞争不可剥夺资源 4)竞争临时资源

Java实现死锁,就是同步中嵌套同步。

代码

//定义线程
class Dead implements Runnable{
	//标志位
	private boolean flag;

	Dead(boolean flag){
		this.flag = flag;
	}

	//复写run方法
	public void run(){
		while(true){
			if(flag){
				//拥有locka,想获取lockb
				synchronized(Lock.locka){
					System.out.println("if locka");

					synchronized(Lock.lockb){
						System.out.println("if lockb");
					}
				}
			}
			else{
				//拥有lockb,想获取locka
				synchronized(Lock.lockb){
					System.out.println("else lockb");

					synchronized(Lock.locka){
						System.out.println("else locka");
					}
				}
			}
		}
	}
}

//定义锁
class Lock {
	static Object locka = new Object();
	static Object lockb = new Object();
}

class DeadLockDemo1{
	public static void main(String[] args){
		//创建线程
		Thread t1 = new Thread(new Dead(true));
		Thread t2 = new Thread(new Dead(false));

		//开启线程
		t1.start();
		t2.start();
	}
}


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
银行家算法是一种避免的经典算法,它主要用于分配有限的资源,以避免出现的情况。下面是Java实现避免银行家算法的示例代码: ```java import java.util.Scanner; public class BankerAlgorithm { private int[][] need; // 还需要的各类资源 private int[][] allocate; // 已分配的各类资源 private int[] available; // 可用的各类资源 private int[] safeSequence; // 安全序列 public void init() { Scanner scanner = new Scanner(System.in); System.out.println("请输入进程数量:"); int processCount = scanner.nextInt(); System.out.println("请输入资源种类数量:"); int resourceCount = scanner.nextInt(); need = new int[processCount][resourceCount]; allocate = new int[processCount][resourceCount]; available = new int[resourceCount]; safeSequence = new int[processCount]; System.out.println("请输入每个进程需要的各类资源:"); for (int i = 0; i < processCount; i++) { for (int j = 0; j < resourceCount; j++) { need[i][j] = scanner.nextInt(); } } System.out.println("请输入每个进程已分配的各类资源:"); for (int i = 0; i < processCount; i++) { for (int j = 0; j < resourceCount; j++) { allocate[i][j] = scanner.nextInt(); } } System.out.println("请输入系统可用的各类资源:"); for (int i = 0; i < resourceCount; i++) { available[i] = scanner.nextInt(); } } public void run() { int processCount = need.length; int resourceCount = available.length; int[] work = new int[resourceCount]; System.arraycopy(available, 0, work, 0, resourceCount); boolean[] finish = new boolean[processCount]; for (int i = 0; i < processCount; i++) { finish[i] = false; } int count = 0; while (count < processCount) { boolean found = false; for (int i = 0; i < processCount; i++) { if (!finish[i]) { boolean enough = true; for (int j = 0; j < resourceCount; j++) { if (need[i][j] > work[j]) { enough = false; break; } } if (enough) { safeSequence[count] = i; count++; finish[i] = true; found = true; for (int j = 0; j < resourceCount; j++) { work[j] += allocate[i][j]; } } } } if (!found) { System.out.println("系统处于不安全状态,无法分配资源!"); return; } } System.out.println("安全序列:"); for (int i = 0; i < processCount; i++) { System.out.print("P" + safeSequence[i]); if (i != processCount - 1) { System.out.print(" -> "); } } System.out.println(); } public static void main(String[] args) { BankerAlgorithm bankerAlgorithm = new BankerAlgorithm(); bankerAlgorithm.init(); bankerAlgorithm.run(); } } ``` 在这个示例代码中,我们通过输入进程数量、资源种类数量、每个进程需要的各类资源、每个进程已分配的各类资源、系统可用的各类资源来初始化我们的银行家算法。接着,我们通过遍历所有进程来找到一个安全的序列。如果无法找到一个安全的序列,则说明当前系统处于不安全状态,无法分配资源。如果找到了一个安全的序列,则输出这个序列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值